package com.xjh.basestudy.designmode.createMode.createMode2_Prototype.p3_DeepClone;

import lombok.Getter;
import lombok.Setter;

/**
 * @Author XuJianHua
 * @Date 2022/9/24 11:41
 * @Description 加装子弹的敌机类EnemyPlane
 *
 * 对于这种复杂一些的敌机类，此时如果进行克隆操作，我们是否能将第3行中的子弹对象一同成功克隆呢？
 * 答案是否定的。我们都知道，Java中的变量分为原始类型和引用类型，所谓浅拷贝是指只复制原始类型的值，比如横坐标x与纵坐标y这种以原始类型int定义的值，它们会被复制到新克隆出的对象中。
 * 而引用类型bullet同样会被拷贝，但是请注意这个操作只是拷贝了地址引用（指针），也就是说副本敌机与原型敌机中的子弹是同一颗，因为两个同样的地址实际指向的内存对象是同一个bullet对象。
 *
 * 需要注意的是，克隆方法中调用父类Object的clone方法进行的是浅拷贝，所以此处的bullet并没有被真正克隆。
 * 然而，每架敌机携带的子弹必须要发射出不同的弹道，这就必然是不同的子弹对象了，所以此时原型模式的浅拷贝实现是无法满足需求的，那么该如何改动呢？
 */
public class EnemyPlaneShallow implements Cloneable{


    @Setter
    @Getter
    public BulletShallow BulletShallow;
    private int x;//敌机横坐标
    private int y = 0;//敌机纵坐标

    public EnemyPlaneShallow(int x) {
        this.x = x;
    }

    @Override
    public EnemyPlaneShallow clone() {
        try {
            EnemyPlaneShallow clone = (EnemyPlaneShallow) super.clone();
            // TODO: copy mutable state here, so the clone can't change the internals of the original
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }


}